package com.xk.domain;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.xk.enums.AppHttpCodeEnum;


import java.io.Serializable;

/**
 * 统一的响应结果类，用于封装接口调用的返回结果。
 * 包含调用状态码（code）、调用结果信息（msg）和调用返回数据（data）。
 * @param <T> 返回数据的泛型类型。
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseResult<T> implements Serializable {
    private Integer code;
    private String msg;
    private T data;

    /**
     * 默认构造方法，初始化为成功状态。
     */
    public ResponseResult() {
        this.code = AppHttpCodeEnum.SUCCESS.getCode();
        this.msg = AppHttpCodeEnum.SUCCESS.getMsg();
    }
    /**
     * 带有状态码和数据的构造方法。
     * @param enums 接口调用状态码。
     * @param data 接口调用返回的数据。
     */
    public ResponseResult(AppHttpCodeEnum enums, T data) {
        this.code = enums.getCode();
        this.data = data;
    }
    /**
     * 带有状态码、信息和数据的构造方法。
     * @param enums 接口调用状态码。
     * @param msg 接口调用结果的信息。
     * @param data 接口调用返回的数据。
     */
    public ResponseResult(AppHttpCodeEnum enums, String msg, T data) {
        this.code = enums.getCode();
        this.msg = msg;
        this.data = data;
    }
    /**
     * 带有状态码和信息的构造方法。
     * @param enums 接口调用状态码。
     * @param msg 接口调用结果的信息。
     */
    public ResponseResult(AppHttpCodeEnum enums, String msg) {
        this.code = enums.getCode();
        this.msg = msg;
    }



    /**
     * 创建一个成功的响应结果。
     * @return 响应结果对象。
     */
    public static ResponseResult okResult() {
        ResponseResult result = new ResponseResult();
        return result;
    }

    /**
     * 创建一个带有状态码和信息的成功响应结果。
     * @param code 成功的状态码。
     * @param msg 成功的信息。
     * @return 响应结果对象。
     */
    private static ResponseResult okResult(int code, String msg) {
        ResponseResult result = new ResponseResult();
        return result.ok(code, null, msg);
    }

    /**
     * 创建一个带有数据的成功响应结果。
     * @param data 成功返回的数据。
     * @return 响应结果对象。
     */
    public static ResponseResult okResult(Object data) {
        ResponseResult result = setAppHttpCodeEnum(AppHttpCodeEnum.SUCCESS, AppHttpCodeEnum.SUCCESS.getMsg());
        if(data != null) {
            result.setData(data);
        }
        return result;
    }

    /**
     * 创建一个错误的响应结果。
     * @param code 错误的状态码。
     * @param msg 错误信息。
     * @return 响应结果对象。
     */
    public static ResponseResult errorResult(int code, String msg) {
        ResponseResult result = new ResponseResult();
        return result.error(code, msg);
    }


    /**
     * 根据枚举创建错误的响应结果。
     * @param enums 错误状态的枚举。
     * @return 响应结果对象。
     */
    public static ResponseResult errorResult(AppHttpCodeEnum enums){
        return setAppHttpCodeEnum(enums, enums.getMsg());
    }

    /**
     * 根据枚举和自定义信息创建错误的响应结果。
     * @param enums 错误状态的枚举。
     * @param msg 自定义的错误信息。
     * @return 响应结果对象。
     */
    public static ResponseResult errorResult(AppHttpCodeEnum enums, String msg){
        return setAppHttpCodeEnum(enums, msg);
    }

    /**
     * 根据枚举设置成功的响应结果。
     * @param enums 成功状态的枚举。
     * @return 响应结果对象。
     */
    public static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums){
        return okResult(enums.getCode(), enums.getMsg());
    }

    /**
     * 设置错误的响应结果。
     * @param enums 错误的状态码。
     * @param msg 错误信息。
     * @return 当前响应结果对象。
     */
    private static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums, String msg){
        return okResult(enums.getCode(), msg);
    }

    /**
     * 将当前对象设置为错误状态。
     * @param code 错误的状态码。
     * @param msg 错误信息。
     * @return 当前响应结果对象。
     */
    public ResponseResult<?> error(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
        return this;
    }

    /**
     * 将当前对象设置为成功状态，并携带数据。
     * @param code 成功的状态码。
     * @param data 成功返回的数据。
     * @return 当前响应结果对象。
     */
    public ResponseResult<?> ok(Integer code, T data) {
        this.code = code;
        this.data = data;
        return this;
    }

    /**
     * 将当前对象设置为成功状态，并携带数据和信息。
     * @param code 成功的状态码。
     * @param data 成功返回的数据。
     * @param msg 成功的信息。
     * @return 当前响应结果对象。
     */
    public ResponseResult<?> ok(Integer code, T data, String msg) {
        this.code = code;
        this.data = data;
        this.msg = msg;
        return this;
    }

    /**
     * 将当前对象设置为成功状态，并携带数据。
     * @param data 成功返回的数据。
     * @return 当前响应结果对象。
     */
    public ResponseResult<?> ok(T data) {
        this.data = data;
        return this;
    }

    /**
     * 获取响应的状态码。
     * @return 状态码。
     */
    public Integer getCode() {
        return code;
    }

    /**
     * 设置响应的状态码。
     * @param code 状态码。
     */
    public void setCode(Integer code) {
        this.code = code;
    }

    /**
     * 获取响应的信息。
     * @return 响应信息。
     */
    public String getMsg() {
        return msg;
    }

    /**
     * 设置响应的信息。
     * @param msg 响应信息。
     */
    public void setMsg(String msg) {
        this.msg = msg;
    }

    /**
     * 获取响应的数据。
     * @return 响应数据。
     */
    public T getData() {
        return data;
    }

    /**
     * 设置响应的数据。
     * @param data 响应数据。
     */
    public void setData(T data) {
        this.data = data;
    }
}
